package com.odontosis.view.servicoconveniado;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import com.odontosis.entidade.Procedimento;
import com.odontosis.ioc.ContainerIoc;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisForm;

@SuppressWarnings("serial")
public class FormServicoConvenio extends OdontosisForm  {

	
	private String valor;
	
	private String data;
	
	private String parcela;
	
	private String fiod;
	
	private String paciente;
	
	private String alteracao;
	
	private String pacienteNome;
	
	private String procedimento;
	
	private String idProcedimento;
	
	private boolean guiaAssinada;
	
	private String dataPericia;
	
	private boolean listaVazia = true;
	
	public List<String> erros;
	
	private List<Procedimento> colecaoProcedimentos;
	
	public List<Procedimento> getColecaoProcedimentos() {
		try{
			colecaoProcedimentos = ContainerIoc.getProcedimentoService().findAll();
			Collections.sort(colecaoProcedimentos);
		}catch (Exception e) {
		}
		return colecaoProcedimentos;
	}
	

	public List<String> getErros() {
		if(erros == null){
			return new ArrayList<String>();
		}
		return erros;
	}
	
	public void setErros(List<String> erros) {
		this.erros = erros;
	}

	public String getIdProcedimento() {
		return idProcedimento;
	}

	public void setIdProcedimento(String idProcedimento) {
		this.idProcedimento = idProcedimento;
	}

	public String getProcedimento() {
		return procedimento;
	}

	public void setProcedimento(String convenio) {
		this.procedimento = convenio;
	}


	public String getValor() {
		return valor;
	}

	public String getData() {
		if(data == null){
			data = new SimpleDateFormat("dd/MM/yyyy").format(new Date()); 
		}
		return data;
	}

	public String getParcela() {
		return parcela;
	}

	public String getFiod() {
		return fiod;
	}

	public String getPaciente() {
		return paciente;
	}

	public String getAlteracao() {
		return alteracao;
	}

	public void setValor(String valor) {
		this.valor = valor;
	}

	public void setData(String data) {
		this.data = data;
	}

	public void setParcela(String parcela) {
		this.parcela = parcela;
	}

	public void setFiod(String fiod) {
		this.fiod = fiod;
	}

	public void setPaciente(String paciente) {
		this.paciente = paciente;
	}

	public void setAlteracao(String alteracao) {
		this.alteracao = alteracao;
	}

	public String getPacienteNome() {
		return pacienteNome;
	}

	public void setPacienteNome(String pacienteNome) {
		this.pacienteNome = pacienteNome;
	}
	
	
	@Override
	public ActionErrors validate(ActionMapping mapping,
			HttpServletRequest request) {
		
		ActionErrors errors = new ActionErrors();
		ActionMessages messages = new ActionMessages();

		Set<Procedimento> listaProcedimentos = (Set<Procedimento>) request.getSession().getAttribute("proc");
		boolean salvar = getMetodo() != null && getMetodo().equals("salvar");
		if(!StringUtilsOdontosis.isVazia(getMetodo()) && salvar){
			if(StringUtilsOdontosis.isVazia(getPaciente())){
				messages.add("paciente", new ActionMessage("O campo Paciente deve ser informado."));
			}
			if(StringUtilsOdontosis.isVazia(getFiod())){
				messages.add("paciente", new ActionMessage("O campo FIOD deve ser informado."));
			}
			if(StringUtilsOdontosis.isVazia(getData())){
				messages.add("paciente", new ActionMessage("O campo data deve ser informado."));
			}else{
				if(!StringUtilsOdontosis.isDateValid(getData())){
					messages.add("paciente", new ActionMessage("O campo data é inválido, formato válido dd/mm/yyyy."));
				}
				
			}
			Set<Procedimento> procedimentos = listaProcedimentos;
			if(procedimentos == null || procedimentos.isEmpty()){
				messages.add("paciente", new ActionMessage("Insira ao menos um procedimento ao serviço."));
			}
		}
		request.setAttribute("colecaoProcedimentos", listaProcedimentos);
		
		boolean listaPreenchida = listaProcedimentos != null && !listaProcedimentos.isEmpty();
		if(messages.size() <= 0 && salvar) {
			if(listaPreenchida) {
				for (Procedimento procedimento : listaProcedimentos) {
					if(procedimento.isManutencao() && listaProcedimentos.size() > 1) {
						messages.add("paciente", new ActionMessage("O procedimento \"" + procedimento.getDescricao() + "\" deve ser único para cada FIOD. "));
					}
				}
			}
		}
				
		listaVazia = !listaPreenchida;
		
		
		if (messages.size() > 0 && getMetodo() != null) {
			errors.add(messages);
			erros = new ArrayList<String>();
			for (Iterator iterator = messages.get(); iterator.hasNext();) {
				ActionMessage string = (ActionMessage) iterator.next();
				erros.add(string.getKey());
			}
			request.setAttribute("mensagens", erros);
			return errors;
		} else {
			request.setAttribute("mensagens", null);
			return super.validate(mapping, request);
		}
	}


	public boolean isListaVazia() {
		return listaVazia;
	}


	public void setListaVazia(boolean listaVazia) {
		this.listaVazia = listaVazia;
	}


	public boolean isGuiaAssinada() {
		return guiaAssinada;
	}


	public String getDataPericia() {
		return dataPericia;
	}


	public void setGuiaAssinada(boolean guiaAssinada) {
		this.guiaAssinada = guiaAssinada;
	}


	public void setDataPericia(String dataPericia) {
		this.dataPericia = dataPericia;
	}


	public void setColecaoProcedimentos(List<Procedimento> colecaoProcedimentos) {
		this.colecaoProcedimentos = colecaoProcedimentos;
	}
	
	public boolean isEdicao() {
		if(StringUtilsOdontosis.isVazia(getAlteracao())) {
			return false;
		}
		return true;
	}
	
	
	
}
